FEXP Solver  1.0.0.0
FEXPModelBuilder.h
Go to the documentation of this file.
1 // © FEXP, FEXPEnterprise Solver, Ing. Vaclav Rek
3 // Manages assembly of FE model.
4 // Compiler must support C++ ver.14 and later
6 #ifndef _CFEXPMODELBUILDER_H_
7 #define _CFEXPMODELBUILDER_H_
8 #include "FEXPCommon.h"
9 #include "FEXPElement.h"
10 #include "FEXPSerializeData.h"
11 
18 
21 {
22 public:
24 
25  // model container
27  // add model data
28  virtual bool BuildModel (const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<ICFEXPDataContIntf> data) = 0;
29  virtual bool BuildModelProgress(const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<ICFEXPDataContIntf> data) = 0;
30  // removs structure from model (for NETWORK solution)
31  virtual void RemoveStructure (const std::string & key) = 0;
32  virtual bool RemoveStructureProgress(const std::string & key) = 0;
33  // thread scheduling
34  virtual void ScheduleThreads (size_t opt_id) = 0;
35  virtual bool ScheduleThreadsProgress(size_t opt_id) = 0;
36  // serialization
37  virtual Ptr<t_SerializedData> NetSerializeStructure (const std::string & key) = 0;
38  virtual void NetDeserializeStructure(const std::string & key, Ptr<t_SerializedData> ser_data) = 0;
39 protected:
40  // [no protected members] -----------------------------
41 private:
42  // [no private members ] -----------------------------
43 };
44 
51 // primary template
52 template<typename TInCont, typename TMoCont, typename Enable = void>
56 template<typename TInCont, typename TMoCont>
58  // specialization
59  <TInCont, TMoCont, typename std::enable_if<std::is_base_of<ICFEXPDataContIntf , TInCont>::value &&
60  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
61  : public ICFEXPModelBuilderBase
62 {
63 public:
65  const std::string & build_proc_text, const std::string & remove_proc_text, const std::string & schdl_proc_text);
66  CFEXPModelBuilder(Ptr<TMoCont> & model_cont,
67  const std::string & build_proc_text, const std::string & remove_proc_text, const std::string & schdl_proc_text);
68  virtual ~CFEXPModelBuilder() { }
69 
70  // override pure virtual functions -- model getter
71  virtual Ptr<ICFEXPDataModelContIntf> GetModelContainer() override { return FEXPCOMMON_STACAST(TMoCont, ICFEXPDataModelContIntf, _mo_container); }
72  // override pure virtual functions -- for model building
73  virtual bool BuildModel (const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<TInCont> data) override;
74  virtual bool BuildModelProgress(const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<TInCont> data) override;
75  // override pure virtual functions -- for NETWORK solution
76  virtual void RemoveStructure (const std::string & key) override;
77  virtual bool RemoveStructureProgress(const std::string & key) override;
78  // override pure virtual functions -- thread scheduling
79  virtual void ScheduleThreads (size_t opt_id) override;
80  virtual bool ScheduleThreadsProgress(size_t opt_id) override;
81  // override pure virtual functions -- network serialization
82  virtual Ptr<t_SerializedData> NetSerializeStructure (const std::string & key) override;
83  virtual void NetDeserializeStructure(const std::string & key, Ptr<t_SerializedData> ser_data) override;
84 protected:
85  // [no protected members] -----------------------------
86 private:
87  std::string _build_proc_text;
88  std::string _remve_proc_text;
89  std::string _schdl_proc_text;
90  // model input data
91  struct input_data
92  {
93  Ptr<std::vector<std::string>> _in_file_content;
94  Ptr<TInCont> _in_data_container;
95  input_data(Ptr<std::vector<std::string>> fcontent, Ptr<TInCont> container)
96  : _in_file_content(fcontent), _in_data_container(container) { }
97  };
98  std::map<std::string, Ptr<input_data>> _in_contr_map;
99  Ptr<TMoCont> _mo_container;
100  // mapping data to each model -- network solution
101  size_t _model_id_generator;
102 };
103 
104 // member functions
106 //--------------------------------------------------------------------------------------
107 template<typename TInCont, typename TMoCont>
109  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
111  const std::string & build_proc_text, const std::string & remove_proc_text, const std::string & schdl_proc_text)
113  _build_proc_text(build_proc_text), _remve_proc_text(remove_proc_text), _schdl_proc_text(schdl_proc_text),
114  _mo_container(CFEXPDataManager<TMoCont>::SafeAllocInstance()), _model_id_generator(FEXPCOMMON_DEFAULT_VALUE) { }
115 //--------------------------------------------------------------------------------------
116 
117 //--------------------------------------------------------------------------------------
118 template<typename TInCont, typename TMoCont>
120  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
121  ::CFEXPModelBuilder(Ptr<TMoCont> & model_cont,
122  const std::string & build_proc_text, const std::string & remove_proc_text, const std::string & schdl_proc_text)
124  _build_proc_text(build_proc_text), _remve_proc_text(remove_proc_text), _schdl_proc_text(schdl_proc_text), _mo_container(model_cont),
125  _model_id_generator(FEXPCOMMON_DEFAULT_VALUE) { }
126 //--------------------------------------------------------------------------------------
127 
130 //--------------------------------------------------------------------------------------
131 template<typename TInCont, typename TMoCont>
133  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
134  ::BuildModel(const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<TInCont> data)
135 //--------------------------------------------------------------------------------------
136 {
137  if (_in_contr_map.count(key))
138  return false;
139  _in_contr_map.insert(MAP_PAIR(key, CFEXPDataManager<input_data>::SafeAllocInstance(fcontent, data)));
140  data->SetData(FEXPCOMMON_STACAST(TMoCont, ICFEXPDataModelContIntf, _mo_container), key);
141  return true;
142 }
143 
146 //--------------------------------------------------------------------------------------
147 template<typename TInCont, typename TMoCont>
149  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
150  ::BuildModelProgress(const std::string & key, Ptr<std::vector<std::string>> fcontent, Ptr<TInCont> data)
151 //--------------------------------------------------------------------------------------
152 {
153  return CFEXPAsyncRunner::RunProcedureTask([this, &key, &fcontent, &data] { BuildModel(key, fcontent, data); }, true, _build_proc_text, true);
154 }
155 
156 //--------------------------------------------------------------------------------------
157 template<typename TInCont, typename TMoCont>
159  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
160  ::RemoveStructure(const std::string & key)
161 //--------------------------------------------------------------------------------------
162 {
163  if (!_in_contr_map.count(key))
164  return;
165  _in_contr_map[key]->_in_data_container->RmvData(FEXPCOMMON_STACAST(TMoCont, ICFEXPDataModelContIntf, _mo_container));
166  _in_contr_map.erase(_in_contr_map.find(key));
167 }
168 
169 //--------------------------------------------------------------------------------------
170 template<typename TInCont, typename TMoCont>
172  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
173  ::RemoveStructureProgress(const std::string & key)
174 //--------------------------------------------------------------------------------------
175 {
176  return CFEXPAsyncRunner::RunProcedureTask([this, &key] { RemoveStructure(key); }, true, _remve_proc_text, true);
177 }
178 
179 //--------------------------------------------------------------------------------------
180 template<typename TInCont, typename TMoCont>
182  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
183  ::ScheduleThreads(size_t opt_id)
184 //--------------------------------------------------------------------------------------
185 {
186  _mo_container->ScheduleThreads(opt_id);
187 }
188 
189 //--------------------------------------------------------------------------------------
190 template<typename TInCont, typename TMoCont>
192  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
193  ::ScheduleThreadsProgress(size_t opt_id)
194 //--------------------------------------------------------------------------------------
195 {
196  return CFEXPAsyncRunner::RunProcedureTask([this,&opt_id] { ScheduleThreads(opt_id); }, true, _schdl_proc_text, true);
197 }
198 
199 //--------------------------------------------------------------------------------------
200 template<typename TInCont, typename TMoCont>
202  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
203  ::NetSerializeStructure(const std::string & key)
204 //--------------------------------------------------------------------------------------
205 {
206  if (!_in_contr_map.count(key))
207  return Ptr<t_SerializedData>();
208  return _in_contr_map[key]->_in_data_container->SerData(FEXPCOMMON_STACAST(TMoCont, ICFEXPDataModelContIntf, _mo_container));
209 }
210 
211 //--------------------------------------------------------------------------------------
212 template<typename TInCont, typename TMoCont>
214  std::is_base_of<ICFEXPDataModelContIntf, TMoCont>::value>::type>
215  ::NetDeserializeStructure(const std::string & key, Ptr<t_SerializedData> ser_data)
216 //--------------------------------------------------------------------------------------
217 {
218  if (!_in_contr_map.count(key))
219  return;
220  _in_contr_map[key]->_in_data_container->DesData(FEXPCOMMON_STACAST(TMoCont, ICFEXPDataModelContIntf, _mo_container), ser_data);
221 }
222 
229 
231 template<typename TInCont, typename TMoCont>
233  : public CFEXPModelBuilder<TInCont, TMoCont>
234 {
235 public:
239 
240  // not used interface methods
241  // override pure virtual functions -- for NETWORK solution
242  virtual void RemoveStructure (const std::string & key) override { FEXPCOMMON_NOT_IMPLEMENTED_EX; }
243  virtual bool RemoveStructureProgress(const std::string & key) override { FEXPCOMMON_NOT_IMPLEMENTED_EX; }
244  // override pure virtual functions -- thread scheduling
245  virtual void ScheduleThreads (size_t opt_id) override { FEXPCOMMON_NOT_IMPLEMENTED_EX; }
246  virtual bool ScheduleThreadsProgress(size_t opt_id) override { FEXPCOMMON_NOT_IMPLEMENTED_EX; }
247 protected:
248  // [no protected members] -----------------------------
249 private:
250  // [no private members ] -----------------------------
251 };
252 
253 // member functions
255 //--------------------------------------------------------------------------------------
256 template<typename TInCont, typename TMoCont>
259  : CFEXPModelBuilder<TInCont, TMoCont>("Building server data", FEXPCOMMON_EMPTY_STRING, FEXPCOMMON_EMPTY_STRING) { }
260 //--------------------------------------------------------------------------------------
261 
262 //--------------------------------------------------------------------------------------
263 template<typename TInCont, typename TMoCont>
266  : CFEXPModelBuilder<TInCont, TMoCont>(fe_cont, "Building server data", FEXPCOMMON_EMPTY_STRING, FEXPCOMMON_EMPTY_STRING) { }
267 //--------------------------------------------------------------------------------------
268 
269 #endif // !_CFEXPMODELBUILDER_H_
Base interface of FE model builder.
Definition: FEXPModelBuilder.h:20
Definition: FEXPModelBuilder.h:53
virtual bool RemoveStructureProgress(const std::string &key) override
Definition: FEXPModelBuilder.h:243
#define FEXPCOMMON_STACAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:137
virtual ~ICFEXPModelBuilderBase()
Definition: FEXPModelBuilder.h:23
virtual Ptr< t_SerializedData > NetSerializeStructure(const std::string &key)=0
virtual void NetDeserializeStructure(const std::string &key, Ptr< t_SerializedData > ser_data)=0
virtual bool RemoveStructureProgress(const std::string &key)=0
virtual Ptr< ICFEXPDataModelContIntf > GetModelContainer()=0
virtual void RemoveStructure(const std::string &key)=0
Definition: FEXPCommon.h:276
virtual bool ScheduleThreadsProgress(size_t opt_id)=0
virtual void ScheduleThreads(size_t opt_id) override
Definition: FEXPModelBuilder.h:245
#define FEXPCOMMON_NOT_IMPLEMENTED_EX
Definition: FEXPCommon.h:144
virtual void ScheduleThreads(size_t opt_id)=0
#define FEXPCOMMON_EMPTY_STRING
Definition: FEXPCommon.h:183
virtual void RemoveStructure(const std::string &key) override
Definition: FEXPModelBuilder.h:242
Builder class for server of hybrid-parallel FEXP solver.
Definition: FEXPModelBuilder.h:232
virtual bool ScheduleThreadsProgress(size_t opt_id) override
Definition: FEXPModelBuilder.h:246
virtual bool BuildModelProgress(const std::string &key, Ptr< std::vector< std::string >> fcontent, Ptr< ICFEXPDataContIntf > data)=0
virtual ~CFEXPServerModelBuilder()
Definition: FEXPModelBuilder.h:238
#define MAP_PAIR(key, itm)
Definition: FEXPCommon.h:471
virtual bool BuildModel(const std::string &key, Ptr< std::vector< std::string >> fcontent, Ptr< ICFEXPDataContIntf > data)=0
CFEXPServerModelBuilder()
Definition: FEXPModelBuilder.h:258
#define FEXPCOMMON_DEFAULT_VALUE
Definition: FEXPCommon.h:179
static bool RunProcedureTask(t_Procedure procedure, bool progressbar)
It runs the asynchronous task.
Definition: FEXPConcurency.cpp:12
Base interface for system container.
Definition: FEXPDataContainer.h:76
Smart pointer.
Definition: FEXPCommon.h:274